package com.ssm.changeunit.command;

import com.ssm.changeunit.Environment;
import com.ssm.changeunit.persistance.DatabaseManager;
import com.ssm.changeunit.persistance.ManagedItemListDAO;
import com.ssm.changeunit.persistance.ManagedItemListDTO;
import com.ssm.changeunit.persistance.PersistanceException;
import com.ssm.changeunit.util.FileUtil;
import java.io.File;
import java.io.IOException;
import org.apache.log4j.Logger;


/**
 * 이름을 변경하는 CommandWorker
 * 
 * @author 시리우스
 */
public class RenameCommandWorker extends CommandWorker {
    private Logger log = Logger.getLogger(RenameCommandWorker.class);

    public RenameCommandWorker () {
    }

    public void work (CommandWorkerOptions commandWorkerOptions) throws CommandWorkerException {
        if( commandWorkerOptions == null )
            throw new CommandWorkerException("Option이 null입니다.");
        
        if( !commandWorkerOptions.hasCommandWorkerOption("origin") )
            throw new CommandWorkerException("Origin Option이 존재하지 않습니다.");
        
        if( !commandWorkerOptions.hasCommandWorkerOption("dest") )
            throw new CommandWorkerException("Dest Option이 존재하지 않습니다.");
        
        // Origin option을 가져온다.
        CommandWorkerOption originCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("origin");
        
        String[] originFileNames = originCommandWorkerOption.getValues();
        
        if(originFileNames.length == 0) 
            throw new CommandWorkerException("Origin 값이 존재하지 않습니다.");
        
        // Dest option을 가져온다.
        CommandWorkerOption destCommandWorkerOption = commandWorkerOptions.getCommandWorkerOption("dest");
        
        String[] destFileNames = destCommandWorkerOption.getValues();
        
        if(destFileNames.length == 0) 
            throw new CommandWorkerException("Dest 값이 존재하지 않습니다.");
        
        try {
            if(!DatabaseManager.getInstance().isExists())
                throw new CommandWorkerException("데이터베이스가 존재하지 않습니다.");
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        log.debug(originFileNames[0] + "을 " + destFileNames[0] + "으로 변경합니다.");
        
        String originRelativePath = "";
        String destRelativePath = "";
        
        try {
            originRelativePath = FileUtil.getRelativePath(new File(originFileNames[0]), new File(Environment.ROOT_DIR));
            destRelativePath = FileUtil.getRelativePath(new File(destFileNames[0]), new File(Environment.ROOT_DIR));
            
            log.debug("Origin Relative Path: " + originRelativePath);
            log.debug("Dest Relative Path: " + destRelativePath);
        }
        catch(IOException ex) {
            throw new CommandWorkerException(ex);
        }
        
        // ManagedItemList에 관리되는 객체가 아니라면...
        // 에러를 발생시킨다.
        try {
            ManagedItemListDAO managedItemListDAO = new ManagedItemListDAO();
            
            if( managedItemListDAO.find(originRelativePath) == null ) 
                throw new CommandWorkerException("ChangeUnit에서 관리되지 않는 파일입니다. File: " + originFileNames[0]);
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException(ex);
        }
        
        File originFile = new File(originFileNames[0]);
        File destFile  = new File(destFileNames[0]);
        
        log.debug("Origin File: " + originFile);
        log.debug("Dest File: " + destFile);

        // 존재하지 않는다면..
        // 에러 발생
        if(!originFile.exists()) 
            throw new CommandWorkerException("Origin file이 존재하지 않습니다. File: " + originFileNames[0]);

        // 이미 목적 파일이 존재 한다면..
        // 에러 발생
        if(destFile.exists()) 
            throw new CommandWorkerException("Dest file이 이미 존재합니다. File: " + destFileNames[0]);
        
        // 로컬 파일의 이름을 변경
        log.debug("파일 이름을 변경합니다.");
        originFile.renameTo(destFile);
        
        // ManagedItemList 이름 변경
        try {
            log.debug("ManagedItemList의 값을 변경합니다.");
            
            ManagedItemListDAO managedItemListDAO = new ManagedItemListDAO();
            managedItemListDAO.delete(originRelativePath);
            
            ManagedItemListDTO managedItemListDTO = new ManagedItemListDTO();
            managedItemListDTO.setFilePath(destRelativePath);
            managedItemListDAO.insert(managedItemListDTO);
        }
        catch(PersistanceException ex) {
            throw new CommandWorkerException("ManagedItemList를 변경할 수 없습니다.", ex);
        }
    }
}

